package com.wsllx.springboot.config;


import com.wsllx.springboot.annotation.ConditionalOnClass;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Map;

/**
 * 作用：匹配对应jar包返回对应网络服务
 * 拿到注解中的value属性，然后用类加载器加载
 * 如果加载到了表示符合条件，否则表示不符合条件
 */
public class OnClassCondition implements Condition {
	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		//获取注解@ConditionalOnClass的所有属性
		Map<String, Object> annotationAttributes =
				metadata.getAnnotationAttributes(ConditionalOnClass.class.getName());
		//获取注解的属性value,即类名
		//这里有个问题：如果@ConditionalOnClass 覆盖了多个方法该怎么判断？
		//或许这就是条件注解的作用，判断路径下jar包是否存在来判断
		String className = (String) annotationAttributes.get("value");
		try {
			//尝试通过类加载器根据类名加载类
			context.getClassLoader().loadClass(className);
			return true;
		} catch (ClassNotFoundException e) {
			return false;
		}
	}
}
